package com.zang.threadschema.immutable;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * 路由
 * 彩信中心路由规则管理器
 * 不可变对象
 *
 * @author Zhang Qiang
 * @Date 2019/9/11 10:13
 */
public final class MMSCRouter {

    /**
     * 保证可见性
     */
    private static volatile MMSCRouter instance = new MMSCRouter();

    /**
     * 彩信中心信息表
     * 维护手机号前缀和彩信中心之间的映射关系
     */
    private final Map<String, MMSCInfo> resultMap;

    /**
     * 获取彩信中心信息
     */
    public MMSCRouter(){
        resultMap = MMSCRouter.retrieveRouterMapFromDb();
    }

    /**
     * 从数据库表中获取数据
     *
     * @return
     */
    private static Map<String, MMSCInfo> retrieveRouterMapFromDb(){
        Map<String, MMSCInfo> mmscInfoHashMap = new HashMap<>();
        // TODO 模拟查询数据库获取彩信中心数据
        MMSCInfo mmscInfo = new MMSCInfo("138","url",10);
        mmscInfoHashMap.put("#138", mmscInfo);
        return mmscInfoHashMap;
    }

    /**
     * 根据手机号前缀获取对应彩信中心信息
     *
     * @param msisdnPrefix 手机号码前缀
     * @return 彩信中心
     */
    public MMSCInfo getMMSC(String msisdnPrefix){
        return resultMap.get(msisdnPrefix);
    }

    /**
     * 更新实例
     *
     * @param newInstance
     * @return
     */
    public static void setInstance(MMSCRouter newInstance) {
        instance = newInstance;
    }

    /**
     * 拷贝实例
     *
     * @param m
     * @return
     */
    private static Map<String, MMSCInfo> deepCopy(Map<String, MMSCInfo> m){
        Map<String, MMSCInfo> mmscInfoMap = new HashMap<>();
        for (String key : mmscInfoMap.keySet()){
            mmscInfoMap.put(key, new MMSCInfo(m.get(key)));
        }
        return mmscInfoMap;
    }

    public Map<String, MMSCInfo> getResultMap() {
        //做防御性复制
        return Collections.unmodifiableMap(deepCopy(resultMap));
    }

    public static MMSCRouter getInstance(){
        return instance;
    }
}
